#ifndef ANALYSISCONFIG_H
#define ANALYSISCONFIG_H

#include <QWidget>
#include <QListView>
#include <QPushButton>
#include <QRadioButton>
#include <QAbstractButton>
#include <QLineEdit>
#include <QTableWidget>
#include <QHeaderView>
#include <QTableWidgetItem>
#include <QCloseEvent>
#include <QTableWidget>
#include <QItemSelectionModel>
#include <QModelIndexList>

#include "DataAnalysisService.h"
#include "custommessagebox.h"
#include "QPCR.h"
#include "curveoptimization.h"

namespace Ui {
class AnalysisConfig;
}

enum SwitchStatus {
    ON = 1,
    OFF = 0
};

class AnalysisConfig : public QWidget
{
    Q_OBJECT

public:
    explicit AnalysisConfig(QWidget *parent = nullptr);
    ~AnalysisConfig() override;

private:
    Ui::AnalysisConfig *ui;

signals:
    void updateAnalysisConfig(QList<AnalysisTarget> alysTar); // 信号：更新分析配置
    void sigGetAnalysisTarget(); // 信号：获取分析配置靶基因

public slots:
    void shuaiJianSwitch(); // 衰减开关
    void lvBoSwitch(); // 滤波开关
    void ctSwitch(); // ct开关
    void slotCurveOptimization(); // 曲线优化


protected:
    void closeEvent(QCloseEvent *) override; // 关闭窗口事件
    void showEvent(QShowEvent *) override; // 打开窗口事件

private:
    DataAnalysisService *alys; // 初始化分析配置服务

    curveoptimization *curveOptimization{}; // 曲线优化

    /* 开关状态 */
    bool shuaiJianOn; // 衰减
    bool lvBoOn; // 滤波
    bool ctOn; // cts
    bool defaultOn; // 默认配置

    /* 当前选中的基因计算方式下标 */
    int ctMethodIndex; // ct
    int lvBoMethodIndex; // 滤波
    int shuaiJianMethodIndex; // 衰减

    int selectedRow; // 获取当前选中行

    AnalysisTarget curSelTar; // 获取当前选中靶基因
    int curSelTarIndex; // 获取当前选中靶基因其所在的List下标

    QList<AnalysisTarget> alysTarget; // 分析配置用靶基因

    CustomMessageBox *cusMsg; // 自定义输入框

    QList<int> defaultJiXian = {3, 15}; // 默认循环数

public:
    std::tuple<QHash<QString, int>, double> getAnalysisConfig(); // 返回数据分析配置，返回值：其他配置，阈值
    void renderTargetTable(QList<AnalysisTarget> alysTarget); // 渲染分析配置页面靶基因板

private:
    void renderShuaiJianFromConfig(); // 渲染配置文件中的衰减信息
    void renderLvBoFromConfig(); // 渲染配置文件中的滤波信息
    void renderCtFromConfig(); // 渲染配置文件中Ct值信息

    void renderWholeDefaultSwitch(); // 渲染统一设置的默认配置开关
    void renderWholeYuZhiFromConfig(QString peizhi); // 渲染配置文件中统一设置的阈值信息
    void renderWholeJiXianFromConfig(); // 渲染配置文件中统一设置的基线信息

    void setSwitch(QPushButton *switchBtn, SwitchStatus Switch, bool *itemSwitch); // 设置开关图标和状态

    bool checkDataValidation(); // 验证关闭时的数据合法性
    void updateConfigFile(); // 更新配置文件信息
    void updateAnalysisTarget(); // 更新分析配置靶基因信息

    void updateSingleTargetInfo(); // 更新靶基因表右侧单个靶基因信息

    void initComponents(); // 控件初始化

};

#endif // ANALYSISCONFIG_H
